"use strict";

const { createBrowser } = require("jsdom-context-require");
const compiler = require("../../compiler");
const globals = [
  "console",
  "__coverage__",
  "Error",
  "describe",
  "before",
  "after",
  "beforeEach",
  "afterEach",
  "it",
];

const browserExtensions = {
  ".marko": compileMarkoModule,
  ".html": compileMarkoModule,
};

module.exports = function (dir, html, options) {
  options = options || {};
  return createBrowser({
    dir: dir,
    html: html,
    extensions: browserExtensions,
    // runScripts: 'dangerously', // JSDOM 10+
    beforeParse(window, browser) {
      window.global = window;
      window.alert = () => {};
      window.addEventListener("error", (e) => {
        browser.error = browser.error || e.error;
      });
      browser.require("complain").log = (...args) =>
        require("complain").log(...args);
      globals.forEach(function (k) {
        window[k] = global[k];
      });
      if (options.beforeParse) {
        options.beforeParse(window, browser);
      }
    },
  });
};

function compileMarkoModule(module, filename) {
  return module._compile(
    compiler.compileFile(filename, {
      writeToDisk: false,
      output: "vdom",
      browser: true,
      meta: true,
      modules: "cjs",
      babelConfig: {
        babelrc: false,
        configFile: false,
        browserslistConfigFile: false,
      },
    }),
    filename,
  );
}
